package org.wk.account.service;

import com.google.common.base.Strings;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.wk.account.dao.ConfigDao;
import org.wk.account.domain.ConfigEntity;
import org.wk.account.view.ConfigVo;
import org.wk.core.common.view.PageVo;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * @author TangShenShen
 * @Description: 参数配置服务实现类
 * @date 2018/6/5 14:05
 */
@Service
public class ConfigServiceImpl implements ConfigService {
    @Autowired
    private ConfigDao configDao;

    @Override
    public PageVo queryPage(Map<String, Object> params) {
        String code = (String) params.get("code");
        String temp = (String)params.get("page");
        Integer pageNo = temp==null?0:Integer.parseInt(temp)-1;
        temp = (String) params.get("limit");
        Integer pageSize = temp==null?10:Integer.parseInt(temp);

        ConfigEntity config = new ConfigEntity();
        config.setConfigCode(code);
        Page<ConfigEntity> page = configDao.findAll(new Specification<ConfigEntity>() {
            @Override
            public Predicate toPredicate(Root<ConfigEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List<Predicate> list = new ArrayList<Predicate>();
                if(null!=config.getConfigCode()&&!"".equals(config.getConfigCode())){
                    list.add(criteriaBuilder.equal(root.get("configCode").as(String.class), config.getConfigCode()));
                }
                Predicate[] p = new Predicate[list.size()];
                return criteriaBuilder.and(list.toArray(p));
            }
        }, PageRequest.of(pageNo, pageSize, new Sort(Sort.Direction.ASC, "createTime")));

        List<ConfigVo> roleVos = new ArrayList<>();
        for(ConfigEntity configEntity : page.getContent()){
            ConfigVo roleVo = new ConfigVo();
            BeanUtils.copyProperties(configEntity, roleVo);
            roleVo.setConfigId(configEntity.getId());
            roleVos.add(roleVo);
        }
        PageVo<ConfigVo> pageVo = new PageVo<ConfigVo>();
        pageVo.setTotal(page.getTotalElements());
        pageVo.setPageNo(++pageNo);
        pageVo.setPageSize(pageSize);
        pageVo.setResult(roleVos);
        pageVo.setTotalPages(page.getTotalPages());
        return pageVo;
    }

    @Override
    public List<ConfigEntity> selectList() {
        List<ConfigEntity> list = configDao.findAll();

        return list;
    }

    @Override
    public ConfigVo selectById(String configId) {
        Optional<ConfigEntity> optional = configDao.findById(configId);
        ConfigEntity configEntity = optional.get();
        ConfigVo configVo = new ConfigVo();
        BeanUtils.copyProperties(configEntity, configVo);
        configVo.setConfigId(configEntity.getId());
        return configVo;
    }

    @Override
    public void saveOrUpdate(ConfigVo configVo) {
        ConfigEntity configEntity;
        if (Strings.isNullOrEmpty(configVo.getConfigId())) {
            configEntity = new ConfigEntity();
        }else {
            Optional<ConfigEntity> optional = configDao.findById(configVo.getConfigId());
            configEntity = optional.get();
        }
        BeanUtils.copyProperties(configVo, configEntity );
        configDao.saveOrUpdate(configEntity);
    }

    @Override
    public void update(ConfigVo configVo) {

    }

    @Override
    public void deleteBatch(String[] configIds) {

    }

    /**
     * 通过配置码 查询配置详情
     *
     * @param code 配置编码
     * @return
     */
    @Override
    public ConfigVo selectByCode(String code) {
        ConfigEntity configEntity = configDao.findByConfigCode(code);
        ConfigVo configVo = new ConfigVo();
        BeanUtils.copyProperties(configEntity, configVo);
        configVo.setConfigId(configEntity.getId());
        return configVo;

    }
}
